﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TicketsPhone.Domain.Models;
using TicketsPhone.Domain.Access;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Entidades;

namespace TicketsPhone.Domain.Concrete
{
    public class ReporteRepositorio : ConexionSql<ReporteEntidad>
    {
        /// <summary>
        /// Realiza una sumatoria de todos los turnos solicitados dependiendo de la consulta
        /// </summary>
        public int TotalRegistros { get; set; }
        
        /// <summary>
        /// Retorna la totalidad de entidades existentes y cuenta ell número de turnos por cada una de ellas
        /// </summary>
        /// <returns>Lista de entidades con el numero de turnos</returns>
        public List<ReporteEntidad> ObtenerEntidades(DateTime fechaInicio, DateTime fechaFin)
        {
            CrearComando("spReporte_ContarEntidades", true);
            AgregarParametro("@fechaInicio", fechaInicio, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            AgregarParametro("@fechaFin", fechaFin, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            ExecuteReader();
            List<ReporteEntidad> entidades = new List<ReporteEntidad>();
            
            this.TotalRegistros = 0;

            while (Read())
            {
                entidades.Add(new ReporteEntidad() { 
                                Entidad = new EntidadRelacional() { 
                                                                            IdEntidad = GetIntValue("IdEntidad"),
                                                                            Nombre = GetStringValue("Nombre")
                                                                            }
                                , NumTurnos = GetIntValue("turnos")}
                              );
                this.TotalRegistros += GetIntValue("turnos");
    
            }
            return entidades;
        }

        /// <summary>
        /// Retorna el listado de sucutsales con el numero de turnos, filtrando por Entidad
        /// </summary>
        /// <param name="idEntidad">Id de la entidad por la que se desea filtrar</param>
        /// <returns>Listado de sucursales</returns>
        public List<ReporteSucursal> ObtenerSucursales(int idEntidad, DateTime fechaInicio, DateTime fechaFin)
        {
            CrearComando("spReporte_ContarSucursales", true);
            AgregarParametro("@idEntidad", idEntidad, System.Data.ParameterDirection.Input, System.Data.DbType.Int32);
            AgregarParametro("@fechaInicio", fechaInicio, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            AgregarParametro("@fechaFin", fechaFin, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            ExecuteReader();
            List<ReporteSucursal> lista = new List<ReporteSucursal>();
            this.TotalRegistros = 0;

            while (Read())
            {
                lista.Add(new ReporteSucursal()
                {
                    Sucursal = new SucursalRelacional()
                    {
                        IdSucursal = GetIntValue("IdSucursal"),
                        Nombre = GetStringValue("Nombre")
                    }
                    ,
                    NumTurnos = GetIntValue("turnos")
                }
                              );
                this.TotalRegistros += GetIntValue("turnos");

            }
            return lista;
        }

        /// <summary>
        /// Retorna los estados que se ven en las peticiones de una sucursal
        /// </summary>
        /// <param name="idSucursal">id de la sucursal</param>
        /// <returns>Listad de los estados</returns>
        public List<ReporteEstado> ObtenerEstados(int idSucursal, DateTime fechaInicio, DateTime fechaFin)
        {
            CrearComando("spReporte_ContarEstados", true);
            AgregarParametro("@idSucursal", idSucursal, System.Data.ParameterDirection.Input, System.Data.DbType.Int32);
            AgregarParametro("@fechaInicio", fechaInicio, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            AgregarParametro("@fechaFin", fechaFin, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            ExecuteReader();
            List<ReporteEstado> lista = new List<ReporteEstado>();
            this.TotalRegistros = 0;

            while (Read())
            {
                lista.Add(new ReporteEstado()
                {
                    Estado = (EstadoTurno)GetIntValue("IdEstadoTurno")
                    ,
                    NumTurnos = GetIntValue("turnos")
                }
                              );
                this.TotalRegistros += GetIntValue("turnos");
            }
            return lista;
        }


        public List<ReporteHorario> ObtenerHorarios(int idSucursal, DateTime fechaInicio, DateTime fechaFin)
        {
            CrearComando("spReporte_ContarHorario", true);
            AgregarParametro("@idSucursal", idSucursal, System.Data.ParameterDirection.Input, System.Data.DbType.Int32);
            AgregarParametro("@fechaInicio", fechaInicio, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            AgregarParametro("@fechaFin", fechaFin, System.Data.ParameterDirection.Input, System.Data.DbType.DateTime);
            ExecuteReader();
            List<ReporteHorario> lista = new List<ReporteHorario>();
            this.TotalRegistros = 0;

            while (Read())
            {
                lista.Add(new ReporteHorario()
                {
                    Horario = GetStringValue("hora")
                    ,
                    NumTurnos = GetIntValue("turnos")
                }
                              );
                this.TotalRegistros += GetIntValue("turnos");
            }
            return lista;
        }

        

        
            
    }
}
